<?php

/**
 * 分页模板处理
 * @param $page
 * @param $text
 * @param string $active
 * @param string $tpl
 * @return string|string[]
 */
function _pager_full_tpl($page, $text, $active = '', $tpl = "")
{
    empty($tpl) and $tpl = '<li class="page-item {active}"><a href="/blog/list-{page}.html" class="page-link">{text}</a></li>';
    return str_replace(array('{page}', '{text}', '{active}', '{disabled}'), array($page, $text, $active, $active), $tpl);
}

/**
 * 完整分页 < 1 2 3 ...600 >
 * @param int $totalnum 总共多少页
 * @param int $page 当前第几页
 * @param int $pagesize 每页显示多少文章
 * @param int $shownum 显示多少页数字，大于3，左右两个按钮属于首页和最后一页的快进按钮
 * @param string $item_tpl {url}地址占位符 {text}页码占位符 {active}当前页占位符 {disabled}禁用,如果没有{disabled}则会隐藏上一页和下一页
 * @param string $pre_tpl
 * @param string $next_tpl
 * @return string
 */
function pager_full($totalnum, $page, $pagesize = 20, $shownum = 5,$first_str='<<',$last_str='>>', $item_tpl = '', $pre_tpl = '', $next_tpl = '')
{
    $allnum = $shownum;
    $shownum = floor($shownum / 2);
    if (!$shownum) $shownum = 1;
    if (!$pre_tpl) $pre_tpl = $item_tpl;
    if (!$next_tpl) $next_tpl = $item_tpl;
    $totalpage = ceil($totalnum / $pagesize);
    if ($allnum > $totalpage) $allnum = $totalpage;
    if ($totalpage < 2) return '';
    if ($page > $totalpage) return '';
    $page = min($totalpage, $page);
    $start = max(1, $page - $shownum);
    $end = min($totalpage, $page + $shownum);
    while ($end - $start < $allnum) {
        if ($start > 1) {
            $start--;
        } else if ($end < $totalpage) {
            $end++;
        } else {
            break;
        }
    }
    $s = [];
    if (strpos($pre_tpl,'{disabled}')!==false){
        $s[] = _pager_full_tpl($page - 1, '', ($page != 1) ? '' : 'disabled', $pre_tpl);
    }
    if ($start > 1) {
        $s[] = _pager_full_tpl(1, $first_str, '', $item_tpl);
    }
    for ($i = $start; $i <= $end; $i++) {
        $s[] = _pager_full_tpl($i, $i, $i == $page ? ' active' : '', $item_tpl);
    }
    if ($end < $totalpage) {
        $s[] = _pager_full_tpl($totalpage, $last_str, '', $item_tpl);
    }
    if (strpos($next_tpl,'{disabled}')!==false) {
        $s[] = _pager_full_tpl($page + 1, '', ($page != $totalpage) ? '' : 'disabled', $next_tpl);
    }
    return join('', $s);
}

/**
 * 简单分页，只显示上一页，下一页
 * @param string $url 分页的地址，如/blog/list-{page}.html，其中{page}会替换为真实的分页数字
 * @param int $totalnum 总页数
 * @param int $page 当前第几页
 * @param int $pagesize 每页显示多少篇
 * @param bool $pagetip_tpl 当前页指示器模板，为空则不显示，{page} 为当前页，{totalpage}为总页数
 * @param string $pre_tpl 上一页的模板，其中{url}会替换为真实的上一页地址
 * @param string $next_tpl 下一页的模板，其中{url}会替换为真实的下一页地址
 * @return array 返回数组[上一页，下一页，指示器]
 */
function pager_simple($url, $totalnum, $page, $pagesize = 20, $pagetip_tpl = '{page} / {totalpage}', $pre_tpl = "<li><a href='{url}'>上一页</a></li>", $next_tpl = "<li><a href='{url}'>下一页</a></li>")
{
    $totalpage = ceil($totalnum / $pagesize);
    if ($totalpage < 2) return ['','',''];
    $page = min($totalpage, $page);
    $pre = '';
    $next = '';
    $pagetip = '';
    $pre_tpl = str_replace('{url}', $url, $pre_tpl);
    $next_tpl = str_replace('{url}', $url, $next_tpl);
    $page > 1 and $pre = str_replace('{page}', $page - 1, $pre_tpl);
    $totalnum >= $pagesize and $page != $totalpage and $next = str_replace('{page}', $page + 1, $next_tpl);
    if ($pagetip_tpl) {
        $pagetip_tpl = str_replace('{page}', $page, $pagetip_tpl);
        $pagetip_tpl = str_replace('{totalpage}', $totalpage, $pagetip_tpl);
        $pagetip = $pagetip_tpl;
    }
    return [$pre, $next, $pagetip];
}

/**end:分页**/

/**
 * 纯文本转为html
 * @param $s
 * @return array|string|string[]
 */
function txt_to_html($s)
{
    $s = htmlspecialchars($s);
    $s = str_replace(" ", '&nbsp;', $s);
    $s = str_replace("\t", ' &nbsp; &nbsp; &nbsp; &nbsp;', $s);
    $s = str_replace("\r\n", "\n", $s);
    $s = str_replace("\n", '<br>', $s);
    return $s;
}


/**
 *  从资源文件夹获取样式文件，不用带后缀
 *  自动带上文件更新时间
 * @param $cssname
 * @return string
 */
function getCss($cssname)
{
    $WebResDir = SystemDir . WebResDir;
    $f = "{$WebResDir}/css/{$cssname}.css";
    $t = file_modifitime('./' . $f);
    if (strpos('?', $f) === false) {
        $f .= '?v=' . $t;
    } else {
        $f .= '&v=' . $t;
    }
    return $f;
}

/**
 * 从资源文件夹获取JS文件，不用带后缀
 * 自动带上文件更新时间
 * @param $jsname
 * @return string
 */
function getJs($jsname)
{
    $WebResDir = SystemDir . WebResDir;
    $f = "{$WebResDir}/js/{$jsname}.js";
    $t = file_modifitime('./' . $f);
    if (strpos('?', $f) === false) {
        $f .= '?v=' . $t;
    } else {
        $f .= '&v=' . $t;
    }
    return $f;
}

/**
 * 从资源文件夹获取图片文件，要带后缀
 * 自动带上文件更新时间
 * @param $fname
 * @return string
 */
function getImg($fname)
{
    $WebResDir = SystemDir . WebResDir;
    $f = "{$WebResDir}/img/{$fname}";
    $t = file_modifitime('./' . $f);
    if (strpos('?', $f) === false) {
        $f .= '?v=' . $t;
    } else {
        $f .= '&v=' . $t;
    }
    return $f;
}

/**
 * 从资源文件夹获取任何文件，需要带上后缀
 * 自动带上文件更新时间
 * @param $fname
 * @return string
 */
function getRes($fname)
{
    $WebResDir = SystemDir . WebResDir;
    $f = "{$WebResDir}/{$fname}";
    $t = file_modifitime('./' . $f);
    if (strpos('?', $f) === false) {
        $f .= '?v=' . $t;
    } else {
        $f .= '&v=' . $t;
    }
    return $f;
}

/**
 * 输出错误文本
 * @param $msg
 */
function echoErrorString($msg)
{
    echo("<b style='color: red;'> ERROR: </b> $msg <br>");
}

/**
 * 备案号外链,工业和信息化部（工信部）网站地址
 */
function icp_link($icpCode = "")
{
    return "<a href='https://beian.miit.gov.cn/' target='_blank'>{$icpCode}</a>";
}


/**
 * 去除JS的代码
 */
function remove_script($string)
{
    return preg_replace("'<script(.*?)<\/script>'is", "", $string);
}


/**
 * 将关联数组（对象）渲染到模板中
 * @param array $arr 要循环的数组
 * @param string $tpl 要绑定的模板，使用如{title}
 * @param null $preCbk 回调，每个绑定模板前回调，并携带当前元素，如果该函数返回了参数，则作为新的元素进行生成模板
 * @param null $everyCbk 回调，每个元素会回调，并携带当前元素和当前的模板
 * @return string
 */
function render_tpl($arr, $tpl, $preCbk = null, $everyCbk = null)
{
    $can_preCbk = false;
    if ($preCbk && is_callable($preCbk)) {
        $can_preCbk = true;
    }

    $can_everyCbk = false;
    if ($everyCbk && is_callable($everyCbk)) {
        $can_everyCbk = true;
    }


    $list = array();
    foreach ($arr as $k => $v) {
        if ($can_preCbk) {
            $v = $preCbk($v);
        }
        if (is_array($v)) {
            $t = $tpl;
            foreach ($v as $kk => $vv) {
                if (!is_array($vv)) {
                    $t = str_replace('{' . $kk . '}', $vv, $t);
                }
            }
            $list[] = $t;
            if ($can_everyCbk) {
                $everyCbk($v, $t);
            }
        }
    }

    return join('', $list);
}